package poo.razionali;

import poo.sortable.Sortable;
import poo.util.Mat;

@SuppressWarnings("rawtypes")
public class Razionale extends Sortable implements Comparable {
	private int num, den;
	static int contatore = 0;

	public Razionale(Razionale r) {
		this.num = r.num;
		this.den = r.den;

	}

	public Razionale(int nume, int deno) throws DenominatoreNullo {
		if (deno == 0)
			throw new DenominatoreNullo();
		int x = Math.abs(nume);
		int y = Math.abs(deno);
		int cd = Mat.mcd(x, y);

		x = x / cd;
		y = y / cd;

		this.num = nume / cd;
		this.den = deno / cd;

		if (deno < 0) {
			this.num *= -1;
			this.den *= -1;
		}
		contatore++;
	}

	public int getNumeratore() {
		return num;
	}

	public int getDenominatore() {
		return den;
	}

	public Razionale add(Razionale r) throws DenominatoreNullo {
		int mcm = (this.den * r.den) / Mat.mcd(this.den, r.den);
		Razionale s = new Razionale((mcm / this.den) * this.num + (mcm / r.den)
				* r.num, mcm);
		return s;
	}// add

	public Razionale sub(Razionale r) throws DenominatoreNullo {
		int mcm = (this.den * r.den) / Mat.mcd(this.den, r.den);
		Razionale s = new Razionale((mcm / this.den) * this.num - (mcm / r.den)
				* r.num, mcm);
		return s;
	}// sub

	public Razionale mul(Razionale r) throws DenominatoreNullo {
		return new Razionale(this.num * r.num, this.den * r.den);
	}// mul

	public Razionale div(Razionale r) throws DenominatoreNullo {
		return new Razionale(this.num * r.den, this.den * r.num);
	}// div

	public String toString() {
		String s = "" + num;
		if (den != 1 && num != 0)
			s += "/" + den;
		return s;
	}

	public static int razionaliCreati() {
		return contatore;
	}

	public void finalize() {
		contatore--;
	}

	@Override
	public int compareTo(Sortable s) {
		Razionale r = (Razionale) s;
		int cd = Mat.mcm(this.den, r.den);
		int n1 = (cd / this.den) * this.num;
		int n2 = (cd / r.den) * r.num;
		if (n1 < n2)
			return -1;
		if (n1 == n2)
			return 0;
		return +1;
	}

	@Override
	public int compareTo(Object s) {
		Razionale r = (Razionale) s;
		int mcm = Mat.mcm(this.den, r.den) / Mat.mcd(this.den, r.den);
		int n1 = (mcm / this.den) * this.num;
		int n2 = (mcm / r.den) * r.num;
		if (n1 < n2)
			return -1;
		if (n1 > n2)
			return 1;
		return 0;
	}
}
